//引入其他的类
import Snake from "./Snake"
import Food from "./Food";
import ScorePanel from "./ScorePanel";

//游戏控制器，控制其他所有类
class GameControl{
    // 定义三个属性
    snake:Snake
    food:Food
    scorePanel:ScorePanel
    //创建一个属性来存储蛇的一个方向，也就是按键的方向
    direction:string = 'Right'
    // 记录游戏是否结束
    isLive = true

    constructor() {
        this.snake = new Snake()
        this.food = new Food()
        this.scorePanel = new ScorePanel(10,2)
        this.init()
    }

    init(){
        //绑定键盘按键按下事件
        document.addEventListener('keydown',this.keydownHandle.bind(this))
        // 调用run方法，使蛇移动
        this.run()
    }

    // 创建一个键盘按下的响应函数
    /**
     *ArrowUp Up
     *ArrowDown Down
     * ArrowLeft Left
     *ArrowRight Right
     */
    keydownHandle(event:KeyboardEvent){
        // 需要检查event.key的值是否合法（用户是否按了正确的按键）
        // 修改direction属性
        this.direction = event.key
    }

    // 创建一个控制蛇移动的方法
    run(){
        /**
         * 根据方向（this.direction)来使蛇的位置改变
         *      向上 top 减少
         *      向下 top 增加
         *      向左 left 减少
         *      向右 left 增加
         */
        let X = this.snake.X
        let Y = this.snake.Y
        switch (this.direction){
            case "ArrowUp":
            case "Up":
                // 向上移动
                Y -= 10
                break
            case "ArrowDown":
            case "Down":
                // 向下移动
                Y += 10
                break
            case "ArrowLeft":
            case "Left":
                // 向左移动
                X -= 10
                break
            case "ArrowRight":
            case "Right":
                // 向s右移动
                X += 10
                break
        }
        // 蛇吃到食物
        this.checkEat(X,Y)
        // 修改蛇的X和Y值
        try {
            this.snake.X = X
            this.snake.Y = Y
        }catch(e){
            // 异常，游戏结束，弹出提示信息
            alert((e as Error).message+'GAME OVER!')
            this.isLive = false
        }

        // 开启一个定时调用
        this.isLive && setTimeout(this.run.bind(this),300 -(this.scorePanel.level-1)*30)
    }

    // 定义一个方法，用来检查蛇是否吃到食物
    checkEat(X:number,Y:number){
        if(X===this.food.X && Y===this.food.Y){
            // 食物位置要进行重置
            this.food.change()
            // 分数增加
            this.scorePanel.addScore()
            // 蛇增加一节
            this.snake.addBody()
        }
    }
}
export default GameControl